package top.itpath.common.util;

import cn.hutool.core.collection.CollectionUtil;
import top.itpath.common.TreeEntity;

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 树形工具类
 *
 * @author zhaomengru
 * @time 2023/10/13 - 22:26
 */
public class QueryTreeUtil {

    /**
     * 将数据组织成树型数据
     *
     * @param list 所有的实体列表
     * @param curr 当前节点，可为null
     * @param <T>  实现TreeEntity接口的实体
     * @return 树型列表
     */
    public static <T extends TreeEntity> List<T> queryTree(Collection<T> list, T curr) {
        if (CollectionUtil.isNotEmpty(list)) {
            Set<Long> idSet = list.stream().map(TreeEntity::getId).collect(Collectors.toSet());
            Map<? extends Serializable, List<T>> childrenMap = list.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(item -> {
                // 如果父节点不存在，则将其设置为根节点
                if (Objects.isNull(item.getParentId()) || !idSet.contains(item.getParentId())) {
                    return "0";
                } else {
                    return item.getParentId();
                }
            }));
            list.forEach(item -> item.setChildren(childrenMap.get(item.getId())));
            return Objects.isNull(curr) ? childrenMap.get("0") : childrenMap.get(curr.getId());
        }
        return Collections.emptyList();
    }


}
